Linux软件管理技术

GO

0. RPM和DPKG两大阵营

在 GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和 DPKG 为最常见的两类软件包管理工具,他们分别应用于基于 RPM 软件包的 Linux 发行版本和 DEB 软件包的 Linux 发行版本。软件包管理工具的作用是提供在操作系统中安装,升级,卸载需要的软件的方法,并提供对系统中所有软件状态信息的查询。

RPM 全称为 Redhat Package Manager,最早由 Red Hat 公司制定实施,随后被 GNU 开源操作系统接受并成为很多 Linux 系统 (RHEL) 的既定软件标准。与 RPM 进行竞争的是基于 Debian 操作系统 (UBUNTU) 的 DEB 软件包管理工具- DPKG,全称为 Debian Package,功能方面与 RPM 相似。


1. CentOS软件管理

学习CentOS的软件管理方式,包括RPM包的安装更新查询卸载等,还有源码包的安装方式。

1.1. RPM

一个 RPM 包包含了已压缩的软件文件集以及该软件的内容信息(在头文件中保存),通常表现为以 .rpm 扩展名结尾的文件,例如 package.rpm 。对其操作,需要使用 rpm 命令。下面介绍 rpm 工具的参数和使用方法。

1.1.1. RPM 介绍

RPM是Red Hat Package Manager的缩写,由RedHat公司开发。它是以一种数据库记录的方式将我们所需要的套件安装到Linux主机的一套管理程序。也就是说,在Linux系统中存在着一个关于RPM的数据库,它记录了安装的包以及包与包之间的依赖关系。RPM包是预先在Linux机器上编译并打包的文件,安装非常快捷。但是它也有一些缺点,比如安装环境必须与编译时一致或相当,包与包之间存在着相互依赖的情况,卸载包时需要先把依赖的包卸载。如果依赖的包是系统所必须的,就不能卸载这个包,否则系统会崩溃。

RPM包的文件名都由-和.分成了若干部分,一般都像这样 abattis-cantarell-fonts-0.0.16-3.el7.noarch.rpmabrt-2.1.11-45.el7.centos.x86_64.rpm。abrt为包名,2.11为版本信息,45.el7.centos为发布版本号,x86_64为运行平台。常见的运行平台有i386、i486、i586、i686(这三个为32位的CPU)和x86_64(64位的CPU)。另外,有些RPM包并没有写具体的平台而是noarch,这是该包没有平台限制的意思。

1.1.2. rpm 命令

常用选项 意义
-i 表示安装
-v 表示可视化
-h 表示显示安装进度
-U 表示升级
-e 表示卸载
-q 表示查询
-p 表示对RPM包进行查询,通常和其它参数同时使用
–force 表示强制安装,即使覆盖属于其他包的文件也要安装
–nodeps 表示当要安装(或卸载)的RPM包依赖于其它包时,即使其它包没有安装(或卸载),也要安装(或卸载)这个包
命令 功能
rpm -ivh package.rpm 安装RPM包
rpm -Uvh package.rpm 升级RPM包
rpm -ev package 卸载RPM包(这里的filename是通过RPM的查询功能所查询到的)
rpm -q package 查询一个RPM包
rpm -qa (package) 查询当前系统所有已安装的RPM包
rpm -qi package 得到一个已安装的RPM包的相关信息
rpm -ql package 列出一个RPM包的安装文件
rpm -qf 文件的绝对路径 列出某个文件属于哪个RPM包
rpm -qRp package.rpm 查询RPM包的依赖关系

1.1.3. RPM 包管理示例

以下步骤描述了一个普通用户安装 IBM Lotus Notes V85 ( 以下简称 Notes) 的典型操作过程。 Notes 的 RPM 包名为 ibm_lotus_notes-8.5.i586.rpm 。

  • 首先查询是否该软件是否已经在系统中存在 : rpm -qa | grep ibm_lotus_notes。如果返回信息为空那么说明该软件还未被安装。
  • 查询 Notes 软件包内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # rpm -qip ibm_lotus_notes-8.5.i586.rpm
    Name : ibm_lotus_notes Relocations: /opt/ibm/lotus/notes
    Version : 8.5 Vendor: IBM
    Release : 20081211.1925 Build Date: Sat 13 Dec 2008 09:38:55 AM CST
    Install Date: (not installed) Build Host: dithers.notesdev.ibm.com
    Group : Applications/Office
    Source RPM: ibm_lotus_notes-8.5-20081211.1925.src.rpm
    Size : 603779427 License: Commercial
    Signature : DSA/SHA1, Sat 13 Dec 2008 09:43:02 AM CST, Key ID 314c8c6534f9ae75
    Summary : IBM Lotus Notes
    Description :
    IBM Lotus Notes software provides a robust ...
  • 安装 Notes:rpm -ivh ibm_lotus_notes-8.5.i586.rpm。返回信息如下:

    1
    2
    Preparing... ########################################### [100%]
    1:ibm_lotus_notes ########################################### [100%]
  • 升级 Notes:若今后需要基于该版本升级至更高版本的 Notes( 缝 .0 - ibm_lotus_notes-9.0.i586.rpm),则使用 -U 参数:# rpm -Uvh ibm_lotus_notes-8.5.i586.rpm

  • 卸载 Notes:注意卸载软件使用软件名称,而不是包文件名:# rpm -ev ibm_lotus_notes

1.2. YUM 工具

1.2.1. YUM 介绍

YUM工具是用来集中管理RPM包的,使用它会更加方便的进行安装卸载升级RPM包。YUM工具最大的优势在于可以联网去下载所需要的RPM包,然后自动安装,若是所安装的RPM包有依赖关系,它会依次安装所依赖的包。

YUM 基于 RPM 包管理工具,能够从指定的源空间(服务器,本地目录等)自动下载目标 RPM 包并且安装,可以自动处理依赖性关系并进行下载、安装,无须繁琐地手动下载、安装每一个需要的依赖包。此外,YUM 的另一个功能是进行系统中所有软件的升级。如上所述,YUM 的 RPM 包来源于源空间,在 RHEL 中由 /etc/yum.repos.d/ 目录中的 .repo 文件配置指定,如 rhel-debuginfo.repo 的内容:

rhel-debuginfo.repo

1
2
3
4
5
6
[rhel-debuginfo]
name=Red Hat Enterprise Linux 5Client - i386 - Debug
baseurl=ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/i386/Debuginfo/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

YUM 的系统配置文件位于 /etc/yum.conf,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[main]
cachedir=/var/cache/yum
keepcache=1
debuglevel=2
pkgpolicy=newest
logfile=/var/log/yum.log
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
exclude= firefox gftp

配置文件用来定义用户期望的 yum 行为,比如,gpgcheck 表明安装时不进行 gpg 验证,exclued=firefox gftp 表明进行系统全软件升级时不升级 firefox 和 gftp 。

1.2.2. YUM 命令

命令 功能
yum repolist all 列出所有仓库
yum list all 列出仓库中所有软件包
yum list 列出所有可用的RPM包资源。(已安装可未安装的都显示出来,yum list会先列出已经安装的包(Installed Packages) 然后再列出可以安装的包(Available Packages))
yum clean all 清除所有仓库缓存
yum info 软件包名称 查看软件包信息
yum search [关键字] 搜索RPM包(还可以利用 grep 来过滤)
yum install [-y] RPM包名 安装RPM包。加上-y选项,表示自动安装,跳过交互的程序
yum reinstall 软件包名称 重新安装软件包
yum remove [-y] RPM包名 卸载RPM包(注意,卸载时最好不要加-y选项,以免重要的RPM包被卸载掉)
yum check-update 列出系统中可升级的所有软件
yum update [-y] RPM包名 升级RPM包
yum -y update 升级所有包,改变软件设置和系统设置,系统版本内核都升级
yum -y upgrade 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变
yum provides 命令名 查询该命令是由那个包安装的
yum grouplist 列出所有安装过和未安装过的套件
yum groupinfo 软件包组 查询指定的软件包组信息
yum groupinstall 套件名 安装该组件套件
yum groupremove 套件名 卸载该组件套件

1.2.3. 安装YUM扩展源

  1. 我们使用 yum 安装 rpm 包时,经常遇到一些包没有,这时候你可以尝试安装 epel 的扩展源,这里有很多系统不自带的 rpm 包。
  • yum install -y epel-release
  • yum list
  • 你会发现最右侧出现很多 epel 的 rpm 包。
  1. 下载一个扩展源的rpm包,用yum安装。然后用 yum clean allyum makecache 清除缓存,用 yum list 检查是否成功。

1.2.4. 使用本地光盘制作YUN源

有时候,Linux系统不能联网,此时当然就不能很便捷地使用联网的yum源了,这时就需要我们自己在Linux系统下使用光盘制作yum源。具体操作步骤如下:

  1. 挂载光盘
    mount /dev/cdrom /mnt
  2. 删除/etc/yum.repos.d目录下所有的repo文件(删除之前,最好先做一下备份)。
    cp -r /etc/yum.repos.d /etc/yum.repos.d_bak
    rm -rf /etc/yum.repos.d/*
  3. 创建新文件dvd.repo,并添加如下内容:

    1
    2
    3
    4
    5
    6
    # vim /etc/yum.repos.d/dvd.repo
    [dvd]
    name=install dvd
    baseurl=file:///mnt
    enabled=1
    gpgcheck=0
  4. 刷新repos生成缓存,如下所示:
    yum makecache

  5. 然后就可以用yum了。若需要恢复之前的yum源,则进行如下操作:
    1
    2
    3
    # rm -rf /etc/yum.repos.d
    # mv /etc/yum.repos.d_bak /etc/yum.repos.d
    # yum list //这一步是必须要执行的,这样就可以生成缓存,方便下次使用

1.2.5. 利用YUM工具下载RPM包

有时我们需要下载RPM包但不安装,而仅仅是复制给其它机器使用。我们可以用YUM工具来完成这个任务,做到只下载而不安装。命令如下:

  1. 安装 yum-downloadonly(首先需要安装一个插件来支持只下载不安装)
    yum install -y yum-plugin-downloadonly.noarch(如果你的 CentOS 是 5.x 版本,则需要安装 yum-downloadonly.noarch 这个包。)
  2. 只下载而不安装RPM包 yum install 包名 -y --downloadonly (这样虽然下载了,但是并没有保存到我们想要的目录下,它默认保存到了/var/cache/yum/后面还有好几层子目录,根据你系统的版本决定。)
  3. 把RPM包下载到指定目录 yum install 包名 -y --downloadonly --downloaddir=绝对路径
  4. 下载一个已安装过的RPM包 yum reinstall 包名 -y --downloaonly [--downloddir=绝对路径]

2. Ubuntu软件管理

2.1. DEB

2.1.1. DEB 介绍

一个 DEB 包包含了已压缩的软件文件集以及该软件的内容信息(在头文件中保存),通常表现为以 .deb 扩展名结尾的文件,例如 package.deb 。对其操作,需要使用 dpkg 命令。下面介绍 dpkg 工具的参数和使用方法。

2.1.2. dpkg 命令

DPKG 的常规使用方法为 dpkg -? Package(.rpm), 其中 -? 为安装参数 ( 更多信息,请查阅帮助 $man rpm)。

参数 意义
-l 在系统中查询软件内容信息
–info 在系统中查询软件或查询指定rpm包的内容信息
-i 在系统中安装/升级软件
-r 在系统中卸载软件,不删除配置文件
-P(大) 在系统中卸载软件以及其配置文件

depk命令参数使用方法

命令 意义
dpkg -i package.deb 安装或升级DEB包命令
dpkg -r package.deb 卸载DEB包,但是不删除其配置文件
dpkg -P package.deb 卸载DEB包,并且删除其配置文件
dpkg-deb -c package.deb 查询DEB包中包含的文件列表命令
dpkg –info package.deb 查询DEB包中包含的内容信息命令
dpkg -l package 查询系统中所有已安装DEB

2.1.3. DEB 包管理示例

以下步骤描述了一个普通用户安装 IBM Lotus Notes V85 ( 以下简称 Notes) 的典型操作过程。 Notes 的 DEB 包名为 ibm_lotus_notes-8.5.i586.deb。

  • 首先查询是否该软件是否已经在系统中存在:dpkg -l ibm-lotus-*
    • 如果系统中从未安装过 Lotus 产品,那么返回信息为 : No pakcages found matching ibm-lotus-*
    • 如果系统安装过 Lotus 产品,但已被删除,那么返回信息为 : pn ibm-lotus-notes none (no description available)
  • 查询 Notes 软件包内容:dpkg --info ibm_lotus_notes-8.5-i586.deb。返回信息如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    new debian package, version 2.0.
    size 335012296 bytes: control archive= 231821 bytes.
    ...
    Package: ibm-lotus-notes
    Version: 8.5-20081211.1925
    Section: IBM
    Priority: extra
    Architecture: i386
    Installed-Size: 619444
    Maintainer: IBM Lotus Product
    Description: IBM Lotus Notes
    IBM Lotus Notes software provides a robust ... ...
  • 安装 Notes : dpkg -i ibm_lotus_notes-8.5.i586.deb。返回信息如下:

    1
    2
    3
    4
    5
    (Reading database ... 151150 files and directories currently installed.)
    Preparing to replace ibm-lotus-notes 8.5-20081211.1925
    (using ibm-lotus-notes-higher-version.i586.deb) ...
    Unpacking replacement ibm-lotus-notes ...
    Setting up ibm-lotus-notes (higher-version) ...
  • 升级 Notes:dpkg -i ibm_lotus_notes-8.5.i586.deb。返回信息如下:

    1
    2
    3
    4
    5
    (Reading database ... 151150 files and directories currently installed.)
    Preparing to replace ibm-lotus-notes 8.5-20081211.1925
    (using ibm-lotus-notes-higher-version.i586.deb) ...
    Unpacking replacement ibm-lotus-notes ...
    Setting up ibm-lotus-notes (higher-version) ...
  • 卸载 Notes : 注意卸载软件使用软件名称,而不是包文件名:dpkg -P ibm-lotus-notes


2.2. APT工具

2.2.1. APT 介绍

APT 的全称为 Advanced Packaging Tools 。与 YUM 对应,它最早被设计成 DPKG 的前端软件,现在通过 apt-rpm 也支持 rpm 管理。而本节本节将介绍 APT 作为 DPKG 前端的使用。 APT 的主要包管理工具为 APT-GET,通过此工具可满足和上述 YUM 相似的功能要求。

APT 的软件源定义来自 /etc/apt/sources.list 文件:

1
2
3
4
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://cn.archive.ubuntu.com/ubuntu/ hardy main restricted
deb-src http://cn.archive.ubuntu.com/ubuntu/ hardy main restricted

注意每次手动修改上述文件后,需要使用 sudo apt-get update 来更新系统的源使新的源数据被当前系统识别。

Ubuntu 中 APT 的配置文件位于 /etc/apt/apt.conf.d,其中的多个配置文件依功能分类。

2.2.2. APT 命令

命令 意义
apt-get update 更新源索引
apt-get install package-name 安装指定软件
apt-get source package-name 下载指定软件的源文件
apt-get upgrade 将系统中所有软件升级到最新版本
apt-get dist-upgrade 将操作系统连同所有软件升级到最新版本
apt-get remove package-name 卸载指定软件

3. RPM与DEB的一些常见问题

3.1. 查询软件包依赖关系

查询 RPM 包的依赖关系,使用 rpm -qRp

1
2
3
4
5
6
7
# rpm -qRp package_a.rpm
package_b = version_info
package_b >= version_info
package_b <= version_info

表明 package_a.rpm 依赖于 version_info 版的 package_b,或者任何高于并包括 version_info 版的 package_b,亦或低于或包括 version_info 版的 package_b 。所以 package_b.rpm 必须在 package_a 之前安装于系统中。

查询 DEB 包的依赖关系,可解读 dpkg –info 结果中的 Pre-Depends 字段:

1
2
3
4
5
6
7
8
9
10
$ dpkg --info package_a.deb
Pre-depends: package_b (= version_info)
Depends: package_b (= version_info)
Pre-depends: package_b (>= version_info)
Depends: package_b (>= version_info)
Pre-depends: package_b (<= version_info)
Depends: package_b (<= version_info)

表明 package_a.deb 依赖于 version_info 版的 package_b 或者任何高于并包括 version_info 版的 package_b 亦或低于或包括 version_info 版的 package_b. 所以 package_b.deb 必须在 package_a 之前安装于系统中。

所以正确的安装方法如下所示:

对于 package_a,正确的安装方法应该是:

1
2
3
4
5
6
7
##RPM
# rpm -ivh package_b.rpm
# rpm -ivh package_a.rpm
##DEB
$ sudo dpkg -i package_b.deb
$ sudo dpkg -i package_a.deb

如上示例为最理想的依赖关系,实际应用中往往最令用户头疼的是 package_a 依赖于 package_b/c/d/e/f 等多个包 , 而 package_b/c/d/e/f 等包又依赖于 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 … … 为保证软件的正常使用,必须找到所有依赖包以及子依赖包并且安装。过多的依赖关系大大降低了 Linux 软件安装的用户友好性。所以针对此类问题,使用了更高级的包管理策略去解决 - yum/apt 。

3.2. RPM 与 DEB 的兼容 - Alien

Alien 工具可以将 RPM 软件包转换成 DEB 软件包,或把 DEB 软件包转换成 RPM 软件包,以此适应兼容性的需要。注意首先请在系统中安装 alien 。

在 UBUNTU 中使用 alien 将 rpm 转换为 deb 并安装 :

1
2
$ sudo alien -d package.rpm
$ sudo dpkg -i package.deb

在 RHEL 中使用 alien 将 deb 转换为 rpm 并安装 :

1
2
# alien -r package.deb
# rpm -ivh package.rpm

3.3. 常见的一些问题

3.3.1. 可以手动强制不进行 RPM/DEB 的依赖性关系检查吗?

  • RPM:可以。使用 –nodeps 辅助参数,则安装过程将不理会依赖性关系限制,强制安装目标包,如:rpm -i --nodeps package_a.rpm
  • DEB:可以。使用— force-depends 辅助参数,如:dpkg -i --force-depends package_a.deb

3.3.2. RPM 中的 –force 是干什么用的?

RPM 中的默认安装规则是不允许同一个包多次安装的,也不允许降级安装。使用 –force 辅助参数将不考虑以上因素,强制安装 RPM 包。但是,–force 无法强制安装一个不满足系统依赖性关系的包 ( 此时需要用到 –nodeps 参数 ) 。使用方法如:rpm -i --force package_a.rpm

3.3.3. RPM/DPKG 支持远程安装吗?

  • RPM:是。 RPM 支持 HTTP 和 FTP 协议,如:rpm -Uvh ftp://user:pass@ftpserver/package.rpm
  • DEB:最新的基于 DEB 包的系统中,远程安装通常被更先进的 APT 代替。

3.3.4. 可以从 RPM/DPKG 中抽取个别文件吗?

  • RPM:是。可以使用 rpm2cpio 工具来提取文件
  • DEB:是。可以使用 dpkg-deb 工具来提取文件:dpkg-deb --extract ibm_lotus_notes-8.5.i586.deb $dir( 目标目录 )

3.3.5. RPM/DPKG 提供包安装成功的验证机制吗?

  • RPM:是。可以使用 -V 参数进行验证。
  • DEB:Debian 系统通常使用 debsums 工具参数进行验证。

3.3.6. RPM/DPKG 提供包安全签名吗?

  • RPM:是。可以使用 –import 导入与软件同时发布的 GPG KEY, 接着使用 -K 命令来验证包的安全性,如:

    1
    2
    3
    4
    # rpm --import pub_ibm_lotus_notes.gpg
    # rpm -K ibm_lotus_notes-8.5.i586.rpm
    返回信息 :
    ibm_lotus_notes-8.5.i586.rpm: (sha1) dsa sha1 md5 gpg OK
  • DEB:DPKG 不提供原生的 Key 验证机制。可以使用 debsigs 和 debsigs-verify

3.3.7. 如果 RPM 的底层数据库损坏,RPM 还能使用吗?

  • RPM:如果底层数据库损坏,RPM 将无法正常使用。此时最常用的解决方法是重构数据库:rm -f /var/lib/rpm/__* ; rpm -vv --rebuilddb
  • DEB:DPKG 本身不提供底层数据库恢复机制。它的数据库以文件形式保存在 /var/lib/dpkg 目录中。及时地备份这个目录是最好的预防数据库损坏措施。

3.3.8. 可以查询系统中已经安装的某个文件属于哪个 RPM 包吗?

  • RPM:可以。使用 -qf 参数 , 如在安装了 Notes8.5 的系统中:rpm -qf /opt/ibm/lotus/notes/notes;返回信息 : Ibm_lotus_notes-8.5-20081211.1920
  • DEB:可以。使用— search 参数 , 如在安装了 Notes8.5 的系统中:dpkg --search /opt/ibm/lotus/notes/notes;返回信息 : ibm-lotus-notes: /opt/ibm/lotus/notes/notes

3.3.9. 可以查询 RPM 包的安装时间吗?

  • RPM:可以。可使用 –last 查询。如:rpm -qa --last;返回信息 : 系统中所有软件的安装时间。
  • DEB:DPKG 不提供直接的查询参数,但是可以用过查询 dpkg 的日志文件实现这个功能。如:cat /var/log/dpkg.log | grep "\ install\ "

4. 源码包安装

在Linux下安装源码包是最常用的。安装源码包,需要我们把源代码编译成可执行的二进制文件。如果你能读懂这些源代码,就可以修改这些源代码的自定义功能,然后按你的需求编译。使用源码包除了可以自定义修改源代码外,还可以定制相关的功能,因为源码包在编译时可以附加额外的选项。

源码包的编译用到了Linux系统里的编译器。常见的源码包一般都是用C语言开发的,因为C语言是Linux上最标准的程序语言。Linux上的C语言编译器称为gcc。利用它可以把C语言编译成可执行的二进制文件。所有,如果Linux上没有安装gcc,就无法编译源码。可以使用命令yum install -y gcc来完成安装。

4.1. 源码包安装的一般步骤

安装源码包通常需要以下三个步骤:

  1. ./configure。这一步可以定制功能,加上相应的选项即可,具体有什么选项可以通过命令./configure --help来查看。(一般常用的有–prefix=PREFIX这个选项的意思是定义软件包安装到哪里)这一步会自动检测你的Linux系统与相关的套件是否有编译该源代码包时所需要的库,因为一旦缺少某个库,就不能完成编译,所以若是遇到这种情况,要先安装这些库。只有检测通过后,才会生成Makefile文件。
  2. make。使用这个命令,会根据Makefile文件中预设的参数进行编译,这一步其实就是gcc在工作了。
  3. make install。这一步是安装步骤,用于创建相关软件的存放目录和配置文件。

注意,对于以上这3个步骤,并不是所有的源代码包软件都一样,也就是说,源码包的安装并没有标准的安装步骤。这就需要你在拿到源码包解压后,进入目录,找到相关的帮助文档(通常,会以INSTALL或README为文件名)。

通常,源码包都会放置在/usr/local/src目录下,方便对源码包的统一管理。

4.2. 一个源码包安装的实例(安装Apache)

  1. 下载源码包
  • cd /usr/local/src/ #约定目录
  • wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.2.27.tar.bz2
  1. 解压
  • tar jxvf httpd-2.2.27.tar.bz2 //查看README或者INSTALL说明文件
  1. 指定编译参数
  • ./configure --help
  • ./configure --prefix 安装路径 ……
  1. echo $? 验证是否成功
  2. make
  3. echo $? 验证是否成功
  4. make install

OK

0%